package com.zenithmind.document.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.document.pojo.domain.DocumentCategory;
import com.zenithmind.document.pojo.dto.DocumentCategoryCreateDTO;
import com.zenithmind.document.pojo.dto.DocumentCategoryUpdateDTO;
import com.zenithmind.document.pojo.query.DocumentCategoryQueryDTO;
import com.zenithmind.document.pojo.vo.DocumentCategoryVO;

import java.util.List;

/**
 * 文档分类服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface DocumentCategoryService extends IService<DocumentCategory> {

    /**
     * 创建分类
     * 
     * @param createDTO 创建信息
     * @return 分类信息
     */
    DocumentCategoryVO createCategory(DocumentCategoryCreateDTO createDTO);

    /**
     * 更新分类
     * 
     * @param id 分类ID
     * @param updateDTO 更新信息
     * @return 是否成功
     */
    Boolean updateCategory(String id, DocumentCategoryUpdateDTO updateDTO);

    /**
     * 删除分类
     * 
     * @param id 分类ID
     * @return 是否成功
     */
    Boolean deleteCategory(String id);

    /**
     * 批量删除分类
     * 
     * @param ids 分类ID列表
     * @return 是否成功
     */
    Boolean batchDeleteCategories(List<String> ids);

    /**
     * 分页查询分类
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<DocumentCategoryVO> getCategoryPage(DocumentCategoryQueryDTO queryDTO);

    /**
     * 获取分类详情
     * 
     * @param id 分类ID
     * @return 分类详情
     */
    DocumentCategoryVO getCategoryDetail(String id);

    /**
     * 获取分类树
     * 
     * @param parentId 父分类ID
     * @param includeDisabled 是否包含禁用的分类
     * @return 分类树
     */
    List<DocumentCategoryVO> getCategoryTree(String parentId, Boolean includeDisabled);

    /**
     * 获取子分类列表
     * 
     * @param parentId 父分类ID
     * @param includeDisabled 是否包含禁用的分类
     * @return 子分类列表
     */
    List<DocumentCategoryVO> getChildCategories(String parentId, Boolean includeDisabled);

    /**
     * 获取分类路径
     * 
     * @param categoryId 分类ID
     * @return 分类路径
     */
    List<DocumentCategoryVO> getCategoryPath(String categoryId);

    /**
     * 搜索分类
     * 
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 分类列表
     */
    List<DocumentCategoryVO> searchCategories(String keyword, Integer limit);

    /**
     * 获取热门分类
     * 
     * @param limit 限制数量
     * @return 分类列表
     */
    List<DocumentCategoryVO> getHotCategories(Integer limit);

    /**
     * 获取用户创建的分类
     * 
     * @param creatorId 创建者ID
     * @param limit 限制数量
     * @return 分类列表
     */
    List<DocumentCategoryVO> getUserCategories(String creatorId, Integer limit);

    /**
     * 移动分类
     * 
     * @param categoryId 分类ID
     * @param newParentId 新父分类ID
     * @return 是否成功
     */
    Boolean moveCategory(String categoryId, String newParentId);

    /**
     * 调整分类排序
     * 
     * @param categoryIds 分类ID列表（按新顺序排列）
     * @param parentId 父分类ID
     * @return 是否成功
     */
    Boolean reorderCategories(List<String> categoryIds, String parentId);

    /**
     * 复制分类
     * 
     * @param sourceCategoryId 源分类ID
     * @param newName 新分类名称
     * @param parentId 父分类ID
     * @return 新分类信息
     */
    DocumentCategoryVO copyCategory(String sourceCategoryId, String newName, String parentId);

    /**
     * 更新分类文档数量
     * 
     * @param categoryId 分类ID
     * @return 是否成功
     */
    Boolean updateCategoryDocumentCount(String categoryId);

    /**
     * 批量更新分类文档数量
     * 
     * @param categoryIds 分类ID列表
     * @return 是否成功
     */
    Boolean batchUpdateCategoryDocumentCount(List<String> categoryIds);

    /**
     * 获取分类统计信息
     * 
     * @param categoryId 分类ID
     * @return 统计信息
     */
    DocumentCategoryVO getCategoryStatistics(String categoryId);

    /**
     * 检查分类名称是否存在
     * 
     * @param name 分类名称
     * @param parentId 父分类ID
     * @param excludeId 排除的分类ID
     * @return 是否存在
     */
    Boolean checkCategoryNameExists(String name, String parentId, String excludeId);

    /**
     * 检查分类是否可以删除
     * 
     * @param categoryId 分类ID
     * @return 是否可以删除
     */
    Boolean canDeleteCategory(String categoryId);
}
